练习

1.(*1)写出下面声明:一个到字符的指针;一个包含10个整数的数组;一个包含10个整数的数组的引用;一个到字符串的数组的指针;一个到字符的指针的指针;一个常量整数;一个到常量整数的指针;一个到整数的常量指针。并为每个声明做初始化。

2.(*1.5)在你的系统上,对于指针类型char*、int*、void*有什么限制吗?例如,int*可以具有奇数的值吗?提示:对齐问题。

3.(*1)用typedef去定义类型unsigned char,const unsigned char,到整数的指针,到字符的指针的指针,到字符的数组的指针,7个到整数的指针的数组,到包含7个到整数的指针的数组的指针,包含8个数组的数组,其中每个数组包含7个到整数的指针。

4.(*1)写一个函数,它交换两个整数(交换它们的值)。用int*作为参数类型。再写另一个交换函数,用int&作为参数类型。

5.(*1.5)在下面例子里,数组str的大小是什么?

    char str[] = "a short string";

6.(*1)定义了函数f(char),g(char&),h(const char&)之后,用参数'a',49,3300,c,uc,sc作为参数调用它们,其中c是char,uc是unsigned char,sc是signed char。哪些调用是合法的?哪些调用将导致编译器引进临时变量?

7.(*1.5)定义一个包含一年中各个月份的名字和每个月的天数的表格。输出这个表。做这件事情两次:第一次用一个char的数组表示名字,用另一个数组表示天数;另一次用一个结构的数组,在每个结构中保存一个月的名字和它的天数。

8.(*2)运行一些测试,看看你的编译器对于用指针写出的迭代和用下标写出的迭代(5.3.1节)是否真的生成相同的代码。如果能要求不同级别的优化,请看看这些优化将如何影响所生成的代码的质量。

9.(*1.5)找一个例子,其中将一个名字用于它自己的初始式是有意义的。

10.(*1)定义一个字符串的数组,其中的字符串保存的是月份的名字。打印出这些字符串。将这些字符串传递给一个函数去打印出这些字符串。

11.(*2)从输入读一系列的单词,使用Quit作为输入的结束单词。按照读入的顺序打印出这些单词,但同一个单词不要打印两次。修改这个程序,在打印之前对单词排序。

12.(*2)写一个函数,它统计在一个string里一对字母出现的次数。写另一个函数对以零结束的char的数组(C风格的字符串)做同样事情。例如,字符对“ab”在“xabaacbaxabb”里出现了两次。

13.(*1.5)定义一个struct Date以保存日期的轨迹。提供一些函数,从输入读Date,向输出写Date,以及用一个日期去初始化Date。

🔚